
const express = require('express');
const router = express.Router();
const pool = require('../config/bd');
const fs = require('fs');

//获取用户信息
router.get('/user/:id', async (req, res) => {
  try {
    // 网页4[4](@ref)建议通过token验证用户权限
    const userId = req.params.id;
    // 在查询用户数据的SQL中增加日期格式化：
    const [results] = await pool.query(
      `SELECT
    id, username, nickname, more_text,
    DATE_FORMAT(birthday, '%Y-%m-%d') AS birthday,
    gender, avatar, phone,
    family_id, family_name, created_at
  FROM user WHERE id = ?`,
      [userId]
    );

    // 处理用户不存在情况
    if (results.length === 0) {
      return res.status(404).json({ code: 404, message: '用户不存在' });
    }

    // 排除敏感字段
    const { password, ...safeUserData } = results[0];
    res.json({
      code: 200, success: true,
      message: '用户信息查询成功', data: safeUserData
    });
  } catch (error) {
    console.error('获取用户信息失败:', error);
    res.status(500).json({ code: 500, message: '服务器内部错误' });
  }
});

// 更新用户信息
router.patch('/user/:id', async (req, res) => {
  try {
    const userId = req.params.id;
    const updateFields = req.body;

    // 校验修改权限（需配合中间件实现）
    if (Object.keys(updateFields).length === 0) {
      return res.status(400).json({ code: 400, message: '无有效更新字段' });
    }

    // 构建动态更新语句
    const allowedFields = ['nickname', 'more_text', 'birthday',
      'gender', 'avatar', 'phone', 'family_id', 'family_name'];
    const setClause = [];
    const values = [];

    Object.entries(updateFields).forEach(([key, value]) => {
      if (allowedFields.includes(key)) {
        setClause.push(`${key} = ?`);
        values.push(value);
      }
    });

    // 使用预处理防止SQL注入
    const [result] = await pool.query(
      `UPDATE user 
           SET ${setClause.join(', ')}
           WHERE id = ?`,
      [...values, userId]
    );

    // 处理更新结果验证
    if (result.affectedRows === 0) {
      return res.status(404).json({ code: 404, message: '用户不存在或数据未变更' });
    }

    // 在查询用户数据的SQL中增加日期格式化：
    const [results] = await pool.query(
      `SELECT
    id, username, nickname, more_text,
    DATE_FORMAT(birthday, '%Y-%m-%d') AS birthday,
    gender, avatar, phone,
    family_id, family_name, created_at
  FROM user WHERE id = ?`,
      [userId]
    );
    const { password, ...safeUserData } = results[0];

    res.json({ code: 200, success: true, message: '更新成功', data: safeUserData });
  } catch (error) {
    console.error('更新用户信息失败:', error);
    res.status(500).json({ code: 500, message: '服务器内部错误' });
  }
});

const multer = require('multer');
const sharp = require('sharp'); // 新增图片处理库

// 1. 强化存储配置
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    const uploadDir = 'public/uploads/avatars';
    // 自动创建目录（参考网页1/网页2）
    if (!fs.existsSync(uploadDir)) {
      fs.mkdirSync(uploadDir, { recursive: true });
    }
    cb(null, uploadDir);
  },
  filename: (req, file, cb) => {
    // 安全处理文件名（参考网页1）
    const safeName = file.originalname.replace(/[^\w.]/g, '_');
    const uniqueSuffix = `${req.params.id}-${Date.now()}`;
    cb(null, `${uniqueSuffix}-${safeName}.webp`); // 强制转为WebP格式
  }
});
const sanitizeFilename = (name) => {
  return name
    .normalize('NFD').replace(/[\u0300-\u036F]/g, '') // 去除变音符号
    .replace(/[^-\w.]/g, '_') // 过滤特殊字符（保留连字符）
    .replace(/(\.webp)+$/, '.webp') // 防止多重扩展名
    .substring(0, 100); // 限制文件名长度
};

const upload = multer({
  storage, // 使用磁盘存储
  limits: { fileSize: 5 * 1024 * 1024 },
  filename: (req, file, cb) => {
    const safeName = sanitizeFilename(file.originalname);
    const uniqueSuffix = `${req.params.id}-${Date.now()}`;
    cb(null, `${uniqueSuffix}-${safeName}`);
  }
});

const retryUnlink = async (path, retries = 5, delay = 500) => { // 延长重试间隔
  for (let i = 0; i < retries; i++) {
    try {
      await fs.promises.unlink(path);
      return;
    } catch (err) {
      if (err.code === 'ENOENT')
        console.log(`第${i + 1}次重试失败: ${err.message}`);
      await new Promise(r => setTimeout(r, delay * (i + 1))); // 指数退避
    }
  }
  throw new Error(`无法删除文件: ${path}`);
};

// 处理流程
const processImage = async (filePath) => {
  const tempPath = `${filePath}.${Date.now()}.tmp`; // 带时间戳的临时文件

  try {
    // 创建Sharp实例并处理图片
    await sharp(filePath)
      .resize(800)
      .webp({ quality: 80 })
      .toFile(tempPath);

    // 原子操作保障
    await fs.promises.rename(tempPath, filePath); // 先重命名再删除原文件 await retryUnlink(filePath); 
  } catch (err) {
    // 增强错误处理
    await Promise.all([
      retryUnlink(tempPath),
      retryUnlink(filePath)
    ]).catch(() => { });
    throw err;
  }
};

// 图片上传
router.post('/images/upload/:id', upload.single('avatar'), async (req, res) => {
  try {
    const userId = req.params.id;
    if (!req.file) {
      return res.status(400).json({ error: '未选择图片' });
    }

    // 处理图片（参考网页2/网页7）
    await processImage(req.file.path); // 直接处理磁盘文件

    // 4. 生成访问地址（静态资源托管）
    const imageUrl = `/uploads/avatars/${req.file.filename}`;
    const avatar = `${req.protocol}://${req.get('host')}${imageUrl}`

    // 数据库操作（存储文件路径）
    const [result] = await pool.execute(
      'UPDATE user SET avatar = ? WHERE id = ?',
      [avatar, userId]
    );
    // 验证更新有效性（参考网页2的事务管理）
    if (result.affectedRows === 0) {
      throw new Error('用户不存在或更新失败');
    }

    // 查询更新后的数据（关键改进点）
    const [selectResult] = await pool.execute(
      'SELECT avatar FROM user WHERE id = ?',
      [userId]
    );

    res.json({
      success: true,
      message: '图片上传成功！',
      data: {
        avatar: selectResult[0].avatar
      }
    });

  } catch (err) {
    console.error('上传失败:', err);
    const statusCode = err.message.includes('图片文件') ? 400 : 500;
    res.status(statusCode).json({
      error: statusCode === 400, message: '服务器内部错误'
    });
  }
});


module.exports = router;